// 这个文件是WebSocket服务器，负责处理客户端的连接、断开、数据同步等事件。
const { Server } = require('socket.io');
const { YonghuUserModel } = require('../db');

class SocketServer {
  constructor() {
    this.io = null;
    this.connectedUsers = new Map(); // 跟踪连接的用户 {socketId: userId}
    this.checkInterval = null; // 定时检查任务
  }

  // 获取当前本地时间
  getCurrentTime() {
    const now = new Date();
    // 获取本地时区偏移量（分钟）
    const timezoneOffset = now.getTimezoneOffset();
    // 创建本地时间对象
    const localTime = new Date(now.getTime() - (timezoneOffset * 60000));
    return localTime;
  }

  // 初始化WebSocket服务器
  init(server) {
    this.io = new Server(server, {
      cors: {
        origin: ["http://localhost:5173", "http://127.0.0.1:5173", "http://localhost:5174", "http://127.0.0.1:5174", "http://localhost:3000", "http://127.0.0.1:3000"],
        methods: ["GET", "POST", "PUT", "DELETE"]
      }
    });

    this.io.on('connection', (socket) => {
      // 监听用户进入优惠券页面事件
      socket.on('check_my_coupons', async (data) => {
        const { userId } = data;
        // 记录用户连接
        this.connectedUsers.set(socket.id, userId);
        await this.checkUserCouponExpiry(userId, socket);
        
        // 如果这是第一个用户连接，启动定时检查
        if (this.connectedUsers.size === 1) {
          this.startPeriodicCheck();
        }
      });

      socket.on('disconnect', () => {
        // 移除用户连接记录
        this.connectedUsers.delete(socket.id);
        
        // 如果没有用户连接了，停止定时检查
        if (this.connectedUsers.size === 0) {
          this.stopPeriodicCheck();
        }
      });
    });
  }

  // 启动定时检查
  startPeriodicCheck() {
    if (this.checkInterval) {
      return; // 已经在运行
    }
    
    // 每10秒检查一次
    this.checkInterval = setInterval(async () => {
      await this.checkConnectedUsersCoupons();
    }, 10000);
  }

  // 停止定时检查
  stopPeriodicCheck() {
    if (this.checkInterval) {
      clearInterval(this.checkInterval);
      this.checkInterval = null;
    }
  }



  // 检查所有连接用户的优惠券
  async checkConnectedUsersCoupons() {
    const currentTime = this.getCurrentTime();
    
    const userIds = Array.from(new Set(this.connectedUsers.values()));
    
    for (const userId of userIds) {
      await this.checkUserCouponExpiry(userId);
    }
    
  }

  // 检查指定用户的优惠券过期状态
  async checkUserCouponExpiry(userId, socket = null) {
    try {
      const currentTime = this.getCurrentTime();
      
      const user = await YonghuUserModel.findOne({ id: userId });
      if (!user) {
        console.log(`用户 ${userId} 不存在`);
        return;
      }

      if (user.coupons && Array.isArray(user.coupons)) {
        let hasUpdates = false;
        let expiredCount = 0;
        
        user.coupons.forEach(coupon => {
          const endTime = new Date(coupon.endTime);
          const isExpired = endTime <= currentTime;
          
          if (coupon.status === '可使用' && isExpired) {
            coupon.status = '已过期';
            hasUpdates = true;
            expiredCount++;
          }
        });
        
        if (hasUpdates) {
          await user.save();
          
          // 通知前端更新
          if (socket) {
            socket.emit('coupon_expired', { userId: userId });
            console.log(`通过WebSocket发送过期通知给用户 ${userId}`);
          } else if (this.io) {
            this.io.emit('coupon_expired', { userId: userId });
            console.log(`通过广播发送过期通知给用户 ${userId}`);
          }
        } else {
          console.log(`用户 ${userId} 没有需要更新的优惠券`);
        }
      } else {
        console.log(`用户 ${userId} 没有优惠券`);
      }
    } catch (error) {
      console.error(`检查用户 ${userId} 优惠券过期状态时出错:`, error);
    }
  }

  // 检查并更新过期优惠券（保留给API调用）
  async checkAndUpdateExpiredCoupons() {
    try {
      const currentTime = this.getCurrentTime();
      
      const users = await YonghuUserModel.find({});
      
      for (const user of users) {
        if (user.coupons && Array.isArray(user.coupons)) {
          let hasUpdates = false;
          
          user.coupons.forEach(coupon => {
            const endTime = new Date(coupon.endTime);
            const isExpired = endTime <= currentTime;
            
            if (coupon.status === '可使用' && isExpired) {
              coupon.status = '已过期';
              hasUpdates = true;
            }
          });
          
          if (hasUpdates) {
            await user.save();
            // 通知前端更新
            if (this.io) {
              this.io.emit('coupon_expired', { userId: user.id });
            }
          }
        }
      }
    } catch (error) {
      console.error('检查优惠券过期状态时出错:', error);
    }
  }
}

// 创建全局实例
const socketServerInstance = new SocketServer();

module.exports = socketServerInstance; 
